package com.wmlive.hhvideo.common.network;

import com.wmlive.hhvideo.heihei.beans.discovery.AddFavoriteBean;
import com.wmlive.hhvideo.heihei.beans.discovery.BannerListBean;
import com.wmlive.hhvideo.heihei.beans.discovery.MusicCategoryBean;
import com.wmlive.hhvideo.heihei.beans.discovery.MusicContentListBean;
import com.wmlive.hhvideo.heihei.beans.discovery.MusicResultBean;
import com.wmlive.hhvideo.heihei.beans.discovery.TopicContentListBean;
import com.wmlive.hhvideo.heihei.beans.discovery.TopicTypeListBean;
import com.wmlive.hhvideo.heihei.beans.login.MobileLoginResponse;
import com.wmlive.hhvideo.heihei.beans.login.SmsResponse;
import com.wmlive.hhvideo.heihei.beans.main.AttentionResponse;
import com.wmlive.hhvideo.heihei.beans.main.CommentDeleteResponse;
import com.wmlive.hhvideo.heihei.beans.main.DiscoverMessageBean;
import com.wmlive.hhvideo.heihei.beans.main.ExplosionResponse;
import com.wmlive.hhvideo.heihei.beans.main.RecommendResponse;
import com.wmlive.hhvideo.heihei.beans.main.ShortVideoInfoResponse;
import com.wmlive.hhvideo.heihei.beans.main.ShortVideoLoveResponse;
import com.wmlive.hhvideo.heihei.beans.main.UpdateInfo;
import com.wmlive.hhvideo.heihei.beans.main.VideoCommentListResponse;
import com.wmlive.hhvideo.heihei.beans.main.VideoCommentResponse;
import com.wmlive.hhvideo.heihei.beans.main.VideoReportResponse;
import com.wmlive.hhvideo.heihei.beans.opus.OpusPubllicResponseBean;
import com.wmlive.hhvideo.heihei.beans.oss.OSSTokenResponse;
import com.wmlive.hhvideo.heihei.beans.personal.ListFollowerFansResponse;
import com.wmlive.hhvideo.heihei.beans.personal.ListLikeResponse;
import com.wmlive.hhvideo.heihei.beans.personal.ListOpusResponse;
import com.wmlive.hhvideo.heihei.beans.personal.ReportTypeResponse;
import com.wmlive.hhvideo.heihei.beans.personal.UpdateUserResponse;
import com.wmlive.hhvideo.heihei.beans.personal.UserHomeResponse;
import com.wmlive.hhvideo.heihei.beans.search.SearchResponse;
import com.wmlive.hhvideo.heihei.beans.splash.InitResponse;
import com.wmlive.hhvideo.heihei.beans.subject.TopicCreateResponse;
import com.wmlive.networklib.entity.BaseResponse;

import java.util.Map;

import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.Response;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * Created by vhawk on 2017/5/19.
 */

public interface ApiService {

    //测试接口http://baobab.kaiyanapp.com/api/v4/categories/all
    @GET()
    Observable<Response<String>> testUrl(@Url String url);

    @GET
    Observable<Response<BaseResponse>> login(@Url String url, @Query("phone_no") String mobile, @Query("verify_code") String smsCode);

    /**
     * with 接口，每次app启动时调用
     *
     * @param options
     * @return
     */
    @GET("init")
    Observable<Response<InitResponse>> init(@QueryMap Map<String, String> options);


    /**
     * 获取验证码
     *
     * @param mobile
     * @param url
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<SmsResponse>> sendSmsCode(@Url String url, @Field("phone_no") String mobile);


    /**
     * 手机号码登录
     *
     * @param mobile
     * @param smsCode
     * @param url
     * @return
     */
    @GET
    Observable<Response<MobileLoginResponse>> mobileLogin(@Url String url, @Query("phone_no") String mobile, @Query("verify_code") String smsCode);

    /**
     * 第三方登录
     *
     * @param url
     * @param account_source
     * @param account_token
     * @param open_id
     * @param unionid
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<MobileLoginResponse>> signIn(@Url String url, @Field("account_source") String account_source, @Field("account_token") String account_token, @Field("open_id") String open_id, @Field("unionid") String unionid);

    /**
     * 获取推荐视频列表
     *
     * @param url
     * @param offset
     * @return
     */
    @GET
    Observable<Response<RecommendResponse>> fetchRecommendVideo(@Url String url, @Query("offset") int offset);

    /**
     * 获取关注用户的视频列表
     *
     * @param url
     * @param offset
     * @return
     */
    @GET
    Observable<Response<AttentionResponse>> fetchAttentionVideo(@Url String url, @Query("offset") int offset);

    /**
     * 获取单个视频的详细信息
     *
     * @param url
     * @param shortVideoId
     * @return
     */
    @GET
    Observable<Response<ShortVideoInfoResponse>> fetchVideoInfo(@Url String url, @Query("opus_id") long shortVideoId);

    /**
     * 点赞与取消赞
     *
     * @param url
     * @param videoId
     * @return
     */
    @GET
    Observable<Response<ShortVideoLoveResponse>> loveVideo(@Url String url, @Query("opus_id") long videoId);

    /**
     * 关注主播
     *
     * @param url
     * @param userId
     * @return
     */
    @GET
    Observable<Response<BaseResponse>> followAnchor(@Url String url, @Query("user_id") long userId);

    /**
     * 取消关注主播
     *
     * @param url
     * @param userId
     * @return
     */
    @GET
    Observable<Response<BaseResponse>> unFollowAnchor(@Url String url, @Query("user_id") long userId);

    /**
     * 获取评论列表
     *
     * @param url
     * @param videoId
     * @param offset
     * @return
     */
    @GET
    Observable<Response<VideoCommentListResponse>> fetchCommentList(@Url String url, @Query("opus_id") long videoId, @Query("offset") int offset);

    /**
     * 评论、回复评论
     *
     * @param url
     * @param videoId
     * @param title
     * @param remindUserId
     * @param replayUserId
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<VideoCommentResponse>> commentVideo(@Url String url, @Field("opus_id") long videoId, @Field("title") String title, @Field("at_user_ids") String remindUserId, @Field("reply_user_id") long replayUserId);

    /**
     * 删除评论
     *
     * @param url
     * @param id
     * @param commentId @return
     */
    @GET
    Observable<Response<CommentDeleteResponse>> deleteComment(@Url String url, @Query("comment_id") long commentId, @Query("opus_id") long id);

    /**
     * 获取最新视频列表
     *
     * @param url
     * @param offset
     * @return
     */
    @GET
    Observable<Response<ExplosionResponse>> explosionVideo(@Url String url, @Query("offset") int offset);


    /**
     * 个人主页
     *
     * @param url
     * @param user_id
     * @return
     */
    @GET
    Observable<Response<UserHomeResponse>> getUserHome(@Url String url, @Query("user_id") long user_id);


    /**
     * 极光 绑定用户
     *
     * @param url
     * @param device_uuid
     * @param apns_token
     * @return
     */
    @GET
    Observable<Response<BaseResponse>> bindUser(@Url String url, @Query("device_uuid") String device_uuid, @Query("apns_token") String apns_token, @Query("certype") int certype);

    /**
     * 关注列表
     *
     * @param url
     * @param user_id
     * @param offset
     * @return
     */
    @GET
    Observable<Response<ListFollowerFansResponse>> getListFollower(@Url String url, @Query("user_id") long user_id, @Query("offset") int offset);

    /**
     * 修改关注列表--关注状态
     *
     * @param url
     * @param user_id
     * @return
     */
    @GET
    Observable<Response<BaseResponse>> updateFollowerState(@Url String url, @Query("user_id") long user_id);

    /**
     * 修改粉丝列表--关注状态
     *
     * @param url
     * @param user_id
     * @return
     */
    @GET
    Observable<Response<BaseResponse>> updateFansState(@Url String url, @Query("user_id") long user_id);

    /**
     * 粉丝列表
     *
     * @param url
     * @param user_id
     * @param offset
     * @return
     */
    @GET
    Observable<Response<ListFollowerFansResponse>> getListFans(@Url String url, @Query("user_id") long user_id, @Query("offset") int offset);

    /**
     * 更改用户信息
     *
     * @param url
     * @param name
     * @param gender
     * @param birth_day
     * @param region
     * @param description
     * @param cover_ori
     * @param cover_ori_file_sign
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<UpdateUserResponse>> updateUser(@Url String url, @Field("name") String name, @Field("gender") String gender, @Field("birth_day") String birth_day, @Field("region") String region, @Field("description") String description, @Field("cover_ori") String cover_ori, @Field("cover_ori_file_sign") String cover_ori_file_sign);

    /**
     * 作品列表
     *
     * @param url
     * @param user_id
     * @param offset
     * @return
     */
    @GET
    Observable<Response<ListOpusResponse>> getPersonalProductList(@Url String url, @Query("user_id") long user_id, @Query("offset") int offset);

    /**
     * 喜欢的作品列表
     *
     * @param url
     * @param user_id
     * @param offset
     * @return
     */
    @GET
    Observable<Response<ListLikeResponse>> getPersonalLoveList(@Url String url, @Query("user_id") long user_id, @Query("offset") int offset);

    /**
     * 举报列表
     *
     * @param url
     * @return
     */
    @GET
    Observable<Response<ReportTypeResponse>> getListReportType(@Url String url);

    /**
     * 举报用户
     *
     * @param url
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<BaseResponse>> reportUser(@Url String url, @Field("user_id") long user_id, @Field("report_type_id") int report_type_id);

    /**
     * 登出
     *
     * @param url
     * @return
     */
    @POST
    Observable<Response<BaseResponse>> singOut(@Url String url);

    //添加话题
    @FormUrlEncoded
    @POST
    Observable<Response<TopicCreateResponse>> createTopic(@Url String url, @Field("name") String name, @Field("desc") String desc);

    //搜索功能（用户，话题，音乐）
    @FormUrlEncoded
    @POST
    Observable<Response<SearchResponse>> searchSearch(@Url String url, @Field("keyword") String keyword, @Field("doc_type") String doc_type, @Field("offset") int offset);

    //发现模块顶部的banner
    @GET
    Observable<Response<BannerListBean>> banner(@Url String url);

    //发现模块话题列表
    @GET
    Observable<Response<TopicTypeListBean>> topicList(@Url String url, @Query("offset") int offset);

    //发现模块音乐分类
    @GET
    Observable<Response<MusicCategoryBean>> musicCategory(@Url String url);

    //发现模块按分类搜索音乐
    @GET
    Observable<Response<MusicResultBean>> searchMusicByCat(@Url String url, @Query("cat_id") long cat_id, @Query("offset") int offset);

    //发现模块添加到收藏
    @FormUrlEncoded
    @POST
    Observable<Response<AddFavoriteBean>> addFavorite(@Url String url, @Field("music_id") long cat_id);

    //发现模块话题内容列表
    @GET
    Observable<Response<TopicContentListBean>> topicOpusList(@Url String url, @Query("topic_id") long topic_id, @Query("offset") int offset);

    /**
     * 获取osstoken
     *
     * @param url
     * @param module 模块：message，avatar，opus
     * @param format message’: [‘png’, ‘mp3’, ‘jpg’, ‘mp4’]，
     *               avatar’: [‘png’, ‘jpg’] ‘
     *               opus: [‘mp4’, ‘jpg’, ‘webp’, ‘jpeg’]
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<OSSTokenResponse>> getOssToken(@Url String url, @Field("module") String module, @Field("format") String format);

    //发现模块音乐内容列表
    @GET
    Observable<Response<MusicContentListBean>> musicOpusList(@Url String url, @Query("music_id") long music_id, @Query("offset") int offset);

    //上传作品
    @FormUrlEncoded
    @POST
    Observable<Response<OpusPubllicResponseBean>> uploadOpusInfo(@Url String url, @Field("title") String title, @Field("opus_path") String opus_path, @Field("opus_file_sign") String opus_file_sign, @Field("opus_cover") String opus_cover, @Field("opus_cover_sign") String opus_cover_sign, @Field("opus_gif_cover") String opus_gif_cover, @Field("opus_gif_cover_sign") String opus_gif_cover_sign, @Field("topic_id") String topic_id, @Field("music_id") String music_id, @Field("at_user_ids") String at_user_ids, @Field("opus_length") Integer opus_length);

    /**
     * 作品举报列表
     *
     * @param url
     * @return
     */
    @GET
    Observable<Response<ReportTypeResponse>> fetchReportType(@Url String url);

    /**
     * 举报作品
     *
     * @param url
     * @param videoId
     * @param reportTypeId
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<VideoReportResponse>> reportVideo(@Url String url, @Field("opus_id") long videoId, @Field("report_type_id") long reportTypeId);

    @FormUrlEncoded
    @POST
    Observable<Response<BaseResponse>> reportWorks(@Url String url, @Field("opus_id") long videoId, @Field("report_type_id") long reportTypeId);

    /**
     * 删除作品
     *
     * @param url
     * @param videoId
     * @return
     */
    @GET
    Observable<Response<BaseResponse>> deleteVideo(@Url String url, @Query("opus_id") long videoId);


    @Streaming
    @GET
    Observable<ResponseBody> downLoadVideo(@Url String fileUrl);

    //我的收藏音乐
    @GET
    Observable<Response<MusicResultBean>> myCollect(@Url String url, @Query("offset") int offset);

    //检查系统升级
    @GET
    Observable<Response<UpdateInfo>> checkSystemAppUpdate(@Url String urk, @Query("version") String version, @Query("device_platform") String device_platform, @Query("app_name") String app_name, @Query("channel") String channel);

    /**
     * 用户观看行为
     *
     * @param url
     * @param videoId
     * @param viewLength
     * @param shareCount
     * @param downLoadCount
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<Response<BaseResponse>> sendUserBehavior(@Url String url, @Field("opus_id") long videoId, @Field("view_length") long viewLength, @Field("share_count") long shareCount, @Field("download_count") long downLoadCount);


    //发现的消息提醒
    @GET
    Observable<Response<DiscoverMessageBean>> getDiscoveryMessage(@Url String url, @Query("latest_time") long latest_time);
}
